package com.emerquim.correo;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

/**
 * Clase para enviar los correos de alerta a los usuarios
 * @author Felipe Criales
 */
public class Correo{
		
	// -----------------------------------------------------
	// Constantes
	// -----------------------------------------------------
	/**
	 * Nombre del usuario de donde se envia el correo
	 */
	private String usuarioCorreo ;
	
	/**
	 * Password del usuario donde se envia el correo
	 */
	private String passwordCorreo;
	
	/**
	 * El host donde se encuentra el servidor de correo
	 */
	private String hostCorreo;
	
	/**
	 * El puerto de la aplicacion del correo en el servidor
	 */
	private String puertoCorreo;
	
	/**
	 * Destinatarios del correo
	 */
	private String[] destinatarios;
	
	/**
	 * Atributo para el asunto del correo
	 */
	private String asuntoCorreo;
	
	/**
	 * Atributo para el cuerpo del correo
	 */
	private String cuerpoCorreo;
	
	/**
	 * Constructor de la clase
	 */
	public Correo(){
		// Datos de la configuracion del correo
		ResourceBundle propiedades = ResourceBundle.getBundle("mail");		
		this.usuarioCorreo = propiedades.getString("usuarioCorreo");
		this.passwordCorreo = propiedades.getString("passwordCorreo");
		this.hostCorreo = propiedades.getString("hostCorreo");
		this.puertoCorreo = propiedades.getString("puertoCorreo");
		
		this.asuntoCorreo = "";
		this.cuerpoCorreo = "";
	}
	
	
	/**
	 * Constructor de la clase con parametros
	 * @param destinatarios El arreglo con los destinatarios del correo
	 * @param asuntoCorreo El asunto del correo
	 * @param cuerpoCorreo El cuerpo del correo
	 */
	public Correo(String[] destinatarios, String asuntoCorreo,
			String cuerpoCorreo) {
		this.destinatarios = destinatarios;
		this.asuntoCorreo = asuntoCorreo;
		this.cuerpoCorreo = cuerpoCorreo;
	}
	
	/**
	 * Constructor de la clase con parametros
	 * @param destinatarios El arreglo con los destinatarios del correo
	 * @param asuntoCorreo El asunto del correo
	 * @param cuerpoCorreo El cuerpo del correo
	 */
	public boolean enviarCorreo(String[] destinatarios, String asuntoCorreo,
			String cuerpoCorreo) {		
		this.destinatarios = destinatarios;
		this.asuntoCorreo = asuntoCorreo;
		this.cuerpoCorreo = cuerpoCorreo;
		String[] cc={};
		String[] bcc={};
		return this.sendMail(this.usuarioCorreo,this.passwordCorreo,this.hostCorreo, this.puertoCorreo,"true",
				"true",true,"javax.net.ssl.SSLSocketFactory","false",destinatarios,cc,bcc,
				this.asuntoCorreo, this.cuerpoCorreo);
	}

	/**
	 * Enviar el correo dados los atributos del mensaje
	 * @return Retorna si fue posible enviar el correo
	 */
	public boolean enviarCorreo(){
		String[] cc={};
		String[] bcc={};		
		return this.sendMail(this.usuarioCorreo,this.passwordCorreo,this.hostCorreo, this.puertoCorreo,"true",
				"true",true,"javax.net.ssl.SSLSocketFactory","false",destinatarios,cc,bcc,
				this.asuntoCorreo, this.cuerpoCorreo);             
	}
	
	/**
	 * Metodo para enviar el correo por defecto
	 */
	private synchronized boolean sendMail(String userName,String passWord,String host,String port,String starttls,String auth,boolean debug,String socketFactoryClass,String fallback,String[] to,String[] cc,String[] bcc,String subject,String text){
		Properties props = new Properties();
		props.put("mail.smtp.user", userName);
		props.put("mail.smtp.host", host);
		if(!"".equals(port))
			props.put("mail.smtp.port", port);
		if(!"".equals(starttls))
			props.put("mail.smtp.starttls.enable",starttls);
		props.put("mail.smtp.auth", auth);
		if(debug){
			props.put("mail.smtp.debug", "true");
		}else{
			props.put("mail.smtp.debug", "false");         
		}
		if(!"".equals(port))
			props.put("mail.smtp.socketFactory.port", port);
		if(!"".equals(socketFactoryClass))
			props.put("mail.smtp.socketFactory.class",socketFactoryClass);
		if(!"".equals(fallback))
			props.put("mail.smtp.socketFactory.fallback", fallback);

		try		{
			Session session = Session.getDefaultInstance(props, null);
			session.setDebug(debug);
			MimeMessage msg = new MimeMessage(session);
			msg.setText(text);
			msg.setSubject(subject);
			msg.setFrom(new InternetAddress(this.usuarioCorreo));
			for(int i=0;i<to.length;i++){
				msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to[i]));
			}
			for(int i=0;i<cc.length;i++){
				msg.addRecipient(Message.RecipientType.CC, new InternetAddress(cc[i]));
			}
			for(int i=0;i<bcc.length;i++){
				msg.addRecipient(Message.RecipientType.BCC, new InternetAddress(bcc[i]));
			}
			msg.saveChanges();
			Transport transport = session.getTransport("smtp");
			transport.connect(host, userName, passWord);
			transport.sendMessage(msg, msg.getAllRecipients());
			transport.close();
			return true;
		}
		catch (Exception e){
			e.printStackTrace();
			return false;
		}
	}

	public String getUsuarioCorreo() {
		return usuarioCorreo;
	}

	public void setUsuarioCorreo(String usuarioCorreo) {
		this.usuarioCorreo = usuarioCorreo;
	}

	public String getPasswordCorreo() {
		return passwordCorreo;
	}

	public void setPasswordCorreo(String passwordCorreo) {
		this.passwordCorreo = passwordCorreo;
	}

	public String getHostCorreo() {
		return hostCorreo;
	}

	public void setHostCorreo(String hostCorreo) {
		this.hostCorreo = hostCorreo;
	}

	public String getPuertoCorreo() {
		return puertoCorreo;
	}

	public void setPuertoCorreo(String puertoCorreo) {
		this.puertoCorreo = puertoCorreo;
	}

	public String[] getDestinatarios() {
		return destinatarios;
	}

	public void setDestinatarios(String[] destinatarios) {
		this.destinatarios = destinatarios;
	}

	public String getAsuntoCorreo() {
		return asuntoCorreo;
	}

	public void setAsuntoCorreo(String asuntoCorreo) {
		this.asuntoCorreo = asuntoCorreo;
	}

	public String getCuerpoCorreo() {
		return cuerpoCorreo;
	}

	public void setCuerpoCorreo(String cuerpoCorreo) {
		this.cuerpoCorreo = cuerpoCorreo;
	}	
}
